package com.fh.Thread_Use;
/*
1）请编写程序，开启一个线程，该线程每隔1秒。在控制台输出“喵喵，我是小猫咪”
2）对上题改进：当输出80次喵喵，我是小猫咪，结束该线程
3）使用JConsole监控线程执行情况，并画出程序示意图！
 */

public class Thread01 {
    public static void main(String[] args) {
        MyThread01 myThread01 = new MyThread01();
        myThread01.start();//启动线程->最终会执行MyThread01中的run方法
        //说明: 当main线程启动一个子线程，主线程不会阻塞，会继续执行，二者形式是交替执行
        System.out.println("主线程执行"+Thread.currentThread().getName());
        for (int i = 1; i <= 20; i++) {
            System.out.println("主线程i"+i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }

    }
}
class MyThread01 extends Thread{
    int count = 0;
        @Override
        public void run () {
            while(true) {
                System.out.println("喵喵，我是小猫咪"+"-"+ ++count+"线程名："+Thread.currentThread().getName());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                if(count == 80) {
                    break;
                }
            }
        }
    //MyThread01.run()方法实际就是一个普通的方法，没有真正的启动一个线程，他会在当前调用它的下拿出顺序执行
}
//相关源码解读：
/*
其实我们调用的start方法，底层实际是start0
分析；
(1)
   public synchronized void start() {
       start0();
}
(2)
//start0() 是本地方法，是 JVM 调用, 底层是 c/c++实现
//真正实现多线程的效果， 是 start0(), 而不是 run
 */
